﻿// -----------------------------------------------------------------------
// <copyright file="GerenciadorSolicitacaoServico.cs" company="Microsoft">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------



namespace Service
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Persistence;
    using Model;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class GerenciadorSolicitacaoServico
    {

         private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorSolicitacaoServico()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorSolicitacaoServico(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="servico">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(SolicitacaoServicoModel solicitacaoServico)
        {
            tb_solicitacao_servico solicitacaoServicoE = new tb_solicitacao_servico();
            Atribuir(solicitacaoServico, solicitacaoServicoE);
            unitOfWork.RepositorioSolicitacaoServico.Inserir(solicitacaoServicoE);
            unitOfWork.Commit(shared);
            return solicitacaoServicoE.id_solicitacao_servico;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="solicitacaoServico"></param>
        public void Editar(SolicitacaoServicoModel solicitacaoServico)
        {
            tb_solicitacao_servico solicitacaoServicoE = new tb_solicitacao_servico();
            Atribuir(solicitacaoServico, solicitacaoServicoE);
            unitOfWork.RepositorioSolicitacaoServico.Editar(solicitacaoServicoE);
            unitOfWork.Commit(shared);
        }

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="idSolicitacao"></param>
        public void Remover(int idSolicitacao)
        {
            unitOfWork.RepositorioSolicitacaoServico.Remover(solicitacaoServicoE => solicitacaoServicoE.id_solicitacao_servico.Equals(idSolicitacao));
            unitOfWork.Commit(shared);
        }


        /// <summary>
        /// Consulta padrão para retornar dados do Serviço como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<SolicitacaoServicoModel> GetQuery()
        {
            IQueryable<tb_solicitacao_servico> tb_solicitacao_servico = unitOfWork.RepositorioSolicitacaoServico.GetQueryable();
            var query = from solicitacaoServicoE in tb_solicitacao_servico
                        select new SolicitacaoServicoModel
                        {
                            IDsolicitacao = solicitacaoServicoE.id_solicitacao_servico,
                            ssidcliente= solicitacaoServicoE.id_cliente,
                            ssidcarrinho = solicitacaoServicoE.id_carrinho,
                            ssdatasolicitacao = solicitacaoServicoE.solicitacao_servico_data,
                            ssurgencia = solicitacaoServicoE.solicitacao_urgencia,
                            ssconfirmacaoservico = solicitacaoServicoE.solicitacao_servico_aceitou,
                            ssdatainicio = solicitacaoServicoE.solicitacao_servico_estimativa_ini,
                            ssdatatermino = solicitacaoServicoE.solicitacao_servico_estimativa_fim,
                            

                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<SolicitacaoServicoModel> ObterTodos()
        {
            return GetQuery();
        }
        
        /// <summary>
        /// Obtém um Serviço
        /// </summary>
        /// <param name="id_servico">Identificador do serviço na base de dados</param>
        /// <returns>ServicoModel</returns>
        
       
        
        /// <summary>
        /// Atribui dados do ServicoModel para o Servico Entity
        /// </summary>
        /// <param name="servico">Objeto do modelo</param>
        /// <param name="serE">Entity mapeada da base de dados</param>
        private void Atribuir(SolicitacaoServicoModel solicitacao, tb_solicitacao_servico solicitacaoservicoE)
        {
            solicitacaoservicoE.id_cliente = solicitacao.ssidcliente;
            solicitacaoservicoE.id_carrinho = solicitacao.ssidcarrinho;
            solicitacaoservicoE.solicitacao_servico_data = solicitacao.ssdatasolicitacao;
            solicitacaoservicoE.solicitacao_servico_estimativa_ini = solicitacao.ssdatainicio;
            solicitacaoservicoE.solicitacao_servico_estimativa_fim = solicitacao.ssdatatermino;
            solicitacaoservicoE.solicitacao_servico_aceitou = solicitacao.ssconfirmacaoservico;
            solicitacaoservicoE.solicitacao_urgencia = solicitacao.ssurgencia;

        }
        
    }





    
}
